﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Serialization;
using System.Xml;

namespace Sistema.Util
{
    public class Serializacao
    {

        /// <summary>
        /// Cosntrutor da Classe.
        /// </summary>
        public Serializacao()
        {

        }

        
        /// <summary>
        /// Método para deserealizar, ler o conteudo de um xml e transformar em objeto de uma classe.
        /// </summary>
        /// <typeparam name="T">Tipo do retorno do método</typeparam>
        /// <param name="xml">String contendo xml</param>
        /// <returns>retorna um objeto do tipo T</returns>
        public T Deserialize<T>(String xml)
        {
            T retorno;
            // Lê a string recebida
            StringReader a = new StringReader(xml);

            //Cria um objeto da classe de serialização/deserialização, passando o tipo do conteúdo a ser serializado.
            XmlSerializer serialize = new XmlSerializer(typeof(T));

            // Deserializa a string recebida
            retorno = (T)serialize.Deserialize(a);

            //retorna o resultado da serialização
            return retorno;
        }


        /// <summary>
        /// Método para serializar um objeto.
        /// </summary>
        /// <typeparam name="T">Tipo do objeto a ser serializado</typeparam>
        /// <param name="objeto">Objeto a ser serializado</param>
        /// <returns>string com o conteudo do objeto recebeido.</returns>
        public String Serializar<T>(T objeto)
        {
            //Cria um objeto onde será armazenado o conteudo da serialização.
            StringWriter writer = new StringWriter();

            //Cria um objeto da classe de serialização/deserialização, passando o tipo do conteúdo a ser serializado.
            XmlSerializer serializer = new XmlSerializer(typeof(T));

            //Serializa o objeto recebido, inserindo o resultado da serialização numa string.
            serializer.Serialize(writer, objeto);

            //retorna a string com os resultados da serialização.
            return writer.ToString();
        }
        public String Serializar<T>(T objeto,XmlSerializerNamespaces namespaces)
        {
            
            //Cria um objeto onde será armazenado o conteudo da serialização.
           StringWriter writer = new StringWriter();

            //Cria um objeto da classe de serialização/deserialização, passando o tipo do conteúdo a ser serializado.
            XmlSerializer serializer = new XmlSerializer(typeof(T));

            //Serializa o objeto recebido, inserindo o resultado da serialização numa string.
            serializer.Serialize(writer, objeto,namespaces);

            //retorna a string com os resultados da serialização.
            return writer.ToString();
        }

        public String SerializaXml<T>(T objeto,XmlSerializerNamespaces namespaces)
        {
            XmlDocument xDoc = new XmlDocument();
            StringBuilder serializedXML = new StringBuilder();
            XmlSerializer serialize = new XmlSerializer(typeof(T));
            StringWriter sWriter = new StringWriter(serializedXML);
            serialize.Serialize(sWriter, objeto);
            xDoc.LoadXml(serializedXML.ToString());
            return xDoc.InnerXml;
        }

        public T DeserializaXML<T>(XmlDocument doc)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            return (T)serializer.Deserialize(new StringReader(doc.OuterXml));
        }
    }
}
